package kn.tool.ftp;

import cn.hutool.extra.ftp.Ftp;
import cn.hutool.extra.ftp.FtpException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author: dengkunnan
 * @date: 2020-07-12 01:16
 * @description:FTP文件上传工具类，文件/数据读取方式InputStream
 **/
@Slf4j
public class FtpClientHandlerUtil {
    /**
     * FTP文件上传工具类，文件/数据读取方式InputStream，重复上传同一名称文件将覆盖之前的文件。
     *
     * @param host       FTP主机IP
     * @param port       FTP主机端口
     * @param username   登录用户名
     * @param password   登录密码
     * @param uploadPath 文件上传路径
     * @param fileName   上传文件保存名称
     * @param in         输入流
     * @return 上传结果
     * @throws KnException
     */
    public static boolean uploadFile(String host, int port, String username, String password, String uploadPath,
                                     String fileName, InputStream in) throws KnException, FtpException {

        // 参数校验
        if (StringUtils.isEmpty(host) || StringUtils.isEmpty(username)) {
            log.error(">> FTP服务器连接参数[host,port,username,password]为空！");
            throw new KnException(">> FTP服务器连接参数[host,port,username,password]不可为空！");
        }
        if (StringUtils.isEmpty(uploadPath) || StringUtils.isEmpty(fileName) || in == null) {
            log.error(">> 上传文件参数[uploadPath,fileName,in]为空！");
            throw new KnException(">> 上传文件参数[uploadPath,fileName,in]不可为空！");
        }

        // 构造FTP对象
        Ftp ftp = new Ftp(host, port, username, password);
        // 上传文件
        boolean uploadResult = ftp.upload(uploadPath, fileName, in);

        // 关闭流，关闭ftp客户端
        try {
            in.close();
            ftp.close();
        } catch (IOException e) {
            e.printStackTrace();
            log.error(">> FTP上传出现异常，输入流/ftp客户端关闭失败！errMsg:{}", e.getMessage());
        }

        return uploadResult;
    }
}
